/**  
 * 下拉树ComboBoxTree  
 * @extend Ext.form.ComboBox  
 * @xtype 'combotree'  
 *   
 * @author chengbao_zhu  
 */  
  
/**  
 * ----------------------  
 * Demo ComboBoxTree  
 * ----------------------  
 */  
 /*-------------------------------------------------*  
    treecombo = {  
        fieldLabel : '片&nbsp;&nbsp;&nbsp;&nbsp;源&nbsp;&nbsp;&nbsp;&nbsp;类&nbsp;&nbsp;&nbsp;&nbsp;别',  
        width : 127,  
        xtype : 'combotree',  
        passName : 'videoCategory',  
        allowUnLeafClick : false,  
        treeHeight:200,  
        tree : new Ext.tree.TreePanel({  
            rootVisible : false,  
            root : new Ext.tree.AsyncTreeNode({  
                id : 'CategoryRoot',  
                text : "影片分类",  
                expanded : true,  
                loader : new Ext.tree.TreeLoader({  
                    dataUrl : UrlPpts.ajax.vdocategory + '?method=tree'  
                })  
            })  
        }),  
        allowBlank : false  
    }  
*-----------------------------------------------------*/  
  
ComboBoxTree = Ext.extend(Ext.form.ComboBox, {   
  
    /**  
     * -------------------------------------   
     * 作为隐藏域的name属性  
     * -------------------------------------  
     */  
    passName : 'id',   
  
    /**  
     * -------------------------------------   
     * 是否允许非叶子结点的单击事件  
     *   
     * @default false   
     * -------------------------------------  
     */  
    allowUnLeafClick : true,   
  
    /**  
     * ---------------------   
     * 树渲染的模板tpl   
     * ---------------------  
     */  
    // tpl: '<div id="treeTpl"></div>', //html代码   
    /**  
     * -----------------------  
     * 树显示的高度，默认为180  
     * -----------------------  
     */  
    treeHeight : 180,   
  
    store : new Ext.data.SimpleStore({   
        fields : [],   
        data : [[]]   
    }),   
       
    //Default   
    editable : false, // 禁止手写及联想功能   
    mode : 'local',   
    triggerAction : 'all',   
    maxHeight : 500,   
    selectedClass : '',   
    onSelect : Ext.emptyFn,   
    emptyText : '请选择...',   
    setFieldValue:function(id,text){
        this.setValue(text);
        this.passField.value = id;
    },
    /**  
     * 清空值  
     */  
    clearValue : function() {   
        if (this.passField) {   
            this.passField.value = '';   
        }   
  
        this.setRawValue('');   
            },   
       
    /**  
     * 设置传值  
     * @param passvalue  
     */  
    setPassValue: function(passvalue){   
        if (this.passField)   
            this.passField.value = passvalue;   
    },   
  
    /**  
     * --------------------------------------   
     * 下拉树被点击事件添加一处理方法  
     * @param node  
     * --------------------------------------  
     */  
    onTreeSelected : function(node) {   
  		
    },   
  
    /**  
     * ----------------------------------   
     * 树的单击事件处理  
     * @param node,event  
     * ----------------------------------  
     */  
    treeClk : function(node, e) {   
        if (!node.isLeaf() && !this.allowUnLeafClick) {   
            e.stopEvent();// 非叶子节点则不触发   
            return;   
        }   
        this.setValue(node.text);// 设置option值   
        this.collapse();// 隐藏option列表   
  
        if (this.passField)   
            this.passField.value = node.id;// 以树的节点ID传递   
  
        // 选中树节点后的触发事件   
        this.fireEvent('treeselected', node);   
  
    },   
  
    /**  
     * 初始化  
     * Init  
     */  
    initComponent : function() {   
        ComboBoxTree.superclass.initComponent.call(this);   
        this.tree.autoScroll = true;   
        this.tree.height = this.treeHeight;   
        this.tree.containerScroll = false;   
        this.tplId = Ext.id();   
        // overflow:auto"   
        this.tpl = '<div id="' + this.tplId + '" style="' + this.treeHeight   
                + '";overflow:hidden;"></div>';   
  
        /**  
         * -----------------------   
         * 添加treeselected事件，  
         * 选中树节点会激发这个事  
         * 件， 参数为树的节点  
         * ------------------------  
         */  
        this.addEvents('treeselected');   
        // this.on('treeselected',this.onTreeSelected,this);   
    },   
  
    /**  
     * ------------------  
     * 事件监听器   
     * Listener  
     * ------------------  
     */  
    listeners : {   
        'expand' : {   
            fn : function() {   
                if (!this.tree.rendered && this.tplId) {   
  
                    this.tree.render(this.tplId);   
  
                }   
                this.tree.show();   
            },   
            single : true  
        },   
  
        'render' : {   
            fn : function() {   
  
                this.tree.on('click', this.treeClk, this);   
  
                /**  
                 * -------------------------------------------   
                 * 创建隐藏输入域<input />  
                 * 并将其dom传给passField   
                 * ------------------------------------------  
                 */  
                if (this.passName) {   
                    this.passField = this.getEl().insertSibling({   
                        tag : 'input',   
                        type : 'hidden',   
                        name : this.passName,   
                        id : this.passId || Ext.id()   
                    }, 'before', true)   
                }   
  
                this.passField.value = this.passValue !== undefined   
                        ? this.passValue   
                        : (this.value !== undefined ? this.value : '');   
  
                this.el.dom.removeAttribute('name');   
            }   
        },   
        'beforedestroy' : {   
            fn : function(cmp) {   
                this.purgeListeners();   
                this.tree.purgeListeners();   
            }   
        }   
    }   
  
});   
  
/**  
 * ---------------------------------   
 * 将ComboBoxTree注册为Ext的组件,以便使用  
 * Ext的延迟渲染机制，xtype:'combotree'   
 * ---------------------------------  
 */  
Ext.reg('combotree', ComboBoxTree);  